package com.demo.java.OD451_500.OD463;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【推荐多样性(C&D卷-200分)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146351005
 */
public class OdMain {
    public static void main(String[] args) {

        int N = 4; // 每个窗口需要展示的元素个数
        int K = 7; // 需要的窗口数量

        // 定义并初始化每个数组（这里每个数组可以代表一个窗口的数据）
        List<List<Integer>> userArr = new ArrayList<>();
        userArr.add(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)); // 第一个数组
        userArr.add(Arrays.asList(10, 11, 12, 13, 14, 15, 16, 17, 18, 19)); // 第二个数组
        userArr.add(Arrays.asList(20, 21, 22, 23, 24, 25, 26, 27, 28, 29)); // 第三个数组

        List<Integer> ans = new ArrayList<>(); // 用于存储最终结果的数组

        int rows = userArr.size(); // 记录数组的行数
        int[] target = new int[rows]; // 每一行当前选择的位置

        // 直到我们选取足够的元素为止（N * K个元素）
        while (ans.size() < N * K) {
            for (int i = 0; i < rows; i++) {
                int cols = userArr.get(i).size(); // 获取当前行的列数
                if (cols > target[i] + N) {
                    cols = target[i] + N; // 每次最多选取N个元素
                }
                int j = target[i]; // 记录当前行的选择位置
                while (j < cols) {
                    ans.add(userArr.get(i).get(j)); // 从每个数组中选择元素并添加到结果中
                    j++;
                }
                target[i] = cols; // 更新当前行的选择位置
            }
        }

        // 按照N个元素为一组进行分组，形成结果矩阵
        List<List<Integer>> resultMatrix = new ArrayList<>();
        for (int i = 0; i < ans.size(); i += N) {
            resultMatrix.add(ans.subList(i, Math.min(i + N, ans.size())));
        }

        // 只保留前K个窗口的数据
        resultMatrix = resultMatrix.subList(0, K);

        List<Integer> outputList = new ArrayList<>(); // 存储输出的结果

        // 按列遍历矩阵，将每列的数据按顺序输出
        for (int col = 0; col < resultMatrix.get(0).size(); col++) {
            for (List<Integer> row : resultMatrix) {
                if (col < row.size()) {
                    outputList.add(row.get(col));
                }
            }
        }

        // 输出结果
        System.out.println(outputList);
    }
}